home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / WORLDSRC.ZIP / MOTION.C < prev    next >
C/C++ Source or Header  |  1992-08-13  |  18KB  |  854 lines

  1. #define EXTERN extern
  2.  
  3. #include "parame.inc"
  4. #include "variab.h"
  5. #include "arrays.h"
  6. #include "trvtbl.inc"
  7.  
  8. /* World C Version 1.00 copyright 1987 J.D.McDonald 
  9.    Use as you like for non-commercial purposes, but please
  10.    leave this note, and document any changes you make as yours */
  11.  
  12.     static  int     rax[] = {556, 2445, 7552, 1105, 3111};
  13.     static  int     dx[] = {2331, 4293, 2204, 6339, 3325};
  14.     static  int     locx[] = {176, 177, 178, 179, 180};
  15.  
  16. vship()
  17. {
  18.     int             locy, i;
  19.  
  20.     if (wrdnum[0] == ACTIVA) {
  21.     if ((loc < 175 || loc > 181) && loc != 184 && loc != 187)
  22.         speak(71);
  23.     else if (lpill == 0)
  24.         speak(237);
  25.     else if (obloc[YROD] != 2000 + YCLIP || obloc[BSAPPH] != BCLIP + 2000)
  26.         speak(539);
  27.     else if ((obimpr[BDOOR] & 2) == 0)
  28.         speak(544);
  29.     else if (spcloc != 2)
  30.         speak(542);
  31.     else if (loc == 181 || loc == 184 || loc == 187) {
  32.         speak(536);
  33.         oldloc = 0;
  34.         oldlc2 = 0;
  35.         if (loc == 181)
  36.         loc = 177;
  37.         else if (loc == 184)
  38.         loc = 180;
  39.         else
  40.         loc = 179;
  41.     } else {
  42.         locy = 0;
  43.         for (i = 0; i < 5; i++) {
  44.         if (rax[i] == raset && dx[i] == decset)
  45.             locy = locx[i];
  46.         }
  47.         if (locy == 0)
  48.         speak(537);
  49.         else if (loc == locy)
  50.         speak(500);
  51.         else {
  52.         speak(538);
  53.         if (loc == 175)
  54.             speak(545);
  55.         for (i = 1; i <= MOVMAX; i++)
  56.             if (obloc[i] == loc)
  57.             obloc[i] = locy;
  58.         loc = locy;
  59.         oldloc = 0;
  60.         oldlc2 = 0;
  61.         }
  62.     }
  63.     } else if (loc < 176 || loc > 180)
  64.     speak(71);
  65.     else if (lpill == 0)
  66.     speak(237);
  67.     else if (obloc[YROD] != YCLIP + 2000 || obloc[BSAPPH]
  68.          != BCLIP + 2000)
  69.     speak(539);
  70.     else if ((obimpr[BDOOR] & 2) == 0)
  71.     speak(544);
  72.     else if (spcloc != 2)
  73.     speak(542);
  74.     else if (loc == 176)
  75.     speak(540);
  76.     else if (loc == 178)
  77.     speak(541);
  78.     else if (spcloc != 2)
  79.     speak(543);
  80.     else {
  81.     oldloc = 0;
  82.     oldlc2 = 0;
  83.     speak(543);
  84.     if (loc == 177)
  85.         locy = 181;
  86.     else if (loc == 179)
  87.         locy = 187;
  88.     else
  89.         locy = 184;
  90.     for (i = 1; i <= MOVMAX; i++)
  91.         if (obloc[i] == loc)
  92.         obloc[i] = locy;
  93.     loc = locy;
  94.     }
  95. }
  96.  
  97.  
  98. vcross()
  99. {
  100.     int             result;
  101.  
  102.     result = 0;
  103.     /* the tree over the chasm */
  104.  
  105.     if ((loc == 19 || loc == 21) && (dobjs[0] == TREE ||
  106.                dobjs[0] == LOG || dobjs[0] == CHASM) && (prepdo == 0
  107.                   || prepdo == OVER) && (iobj == TREE || iobj ==
  108.                              LOG || iobj == 0)) {
  109.     result = 1;
  110.     prepdo = 0;
  111.     dobjs[0] = NORTHE;
  112.     if (loc == 21)
  113.         dobjs[0] = SOUTHW;
  114.     }
  115.     /* you can't "cross" the lake  */
  116.  
  117.     else if ((loc == 5 || loc == 6 || loc == 15 || loc == 17) && (
  118.                              dobjs[0] == WATER))
  119.     speak(47);
  120.     else
  121.     speak(94);
  122.     return (result);
  123. }
  124.  
  125.  
  126. vcrawl()
  127. {
  128.     int             result;
  129.     result = 0;
  130.     /* you can crawl over the log   */
  131.  
  132.     if ((loc == 19 || loc == 21) && (dobjs[0] == TREE ||
  133.                      dobjs[0] == LOG || dobjs[0] == CHASM) &&
  134.     prepdo == OVER) {
  135.     adverb = CAREFU;
  136.     prepdo = 0;
  137.     oldlc2 = oldloc;
  138.     oldloc = loc;
  139.     if (loc == 19)
  140.         loc = 21;
  141.     else
  142.         loc = 19;
  143.     }
  144.     /* if "crawl direction" but not u or d, then call go  */
  145.  
  146.     else if (dobjs[0] <= NORTHW && prepdo == 0) {
  147.     if (loc == 19 || loc == 21)
  148.         adverb = CAREFU;
  149.     result = 1;
  150.     speak(109);
  151.     }
  152.     /* otherwise, don't understand  */
  153.  
  154.     else
  155.     speak(94);
  156.     return (result);
  157.  
  158. }
  159.  
  160.  
  161.  
  162.  
  163.  
  164.  
  165.  
  166. vjump()
  167. {
  168.     int             result, ncarrd, nweigh, kcarrd, kweigh;
  169.     result = 0;
  170.     /* can't jump if dead */
  171.  
  172.     if (deadf) {
  173.     speak(46);
  174.     return (result);
  175.     }
  176.     /* jumping off the spire is fatal  */
  177.  
  178.     if ((loc == 13 || loc == 14) && ((dobjs[0] == SPIRE &&
  179.                       prepdo == OFF) || dobjs[0] == 0)) {
  180.     speak(49);
  181.     speak(37);
  182.     oldlc2 = 0;
  183.     oldloc = 0;
  184.     loc = 12;
  185.     vdead();
  186.     return (result);
  187.     }
  188.     /* trying to jump the chasm isn't too smart either  */
  189.  
  190.     if ((loc == 21 || loc == 19) && (dobjs[0] == 0 || ((dobjs[0] ==
  191.          CHASM || dobjs[0] == TREE || dobjs[0] == LOG) && (prepdo ==
  192.                            0 || prepdo == OVER)))) {
  193.     speak(49);
  194.     speak(38);
  195.     oldlc2 = 0;
  196.     oldloc = 0;
  197.     loc = 22;
  198.     locdat[22] |= 16384;
  199.     vdead();
  200.     return (result);
  201.     }
  202.     /* but you can jump onto the tower  */
  203.  
  204.     if (loc == 48 && (dobjs[0] == 0 || dobjs[0] == TOWER) &&
  205.     (prepdo == ON || prepdo == 0)) {
  206.     /* if you're not carrying too much  */
  207.  
  208.     burden(&ncarrd, &nweigh, &kcarrd, &kweigh);
  209.     if (ncarrd == 0 && (obloc[ZKNAPS] != 1000 && obloc[ZKNAPS]
  210.                 != 3000) && wirelc[5] != 1000) {
  211.         speak(136);
  212.         oldlc2 = oldloc;
  213.         oldloc = loc;
  214.         loc = 49;
  215.     } else
  216.         speak(139);
  217.  
  218.     return (result);
  219.     }
  220.     /* but not off the tower  */
  221.  
  222.     if ((loc == 49) && ((dobjs[0] == TOWER &&
  223.              prepdo == OFF) || dobjs[0] == 0)) {
  224.     speak(49);
  225.     speak(137);
  226.     oldlc2 = 0;
  227.     oldloc = 0;
  228.     loc = 48;
  229.     vdead();
  230.     return (result);
  231.     }
  232.     /* jumping at the barrier   */
  233.  
  234.     if ((loc == 26 || loc == 27) && dobjs[0] == BARRIE) {
  235.     if (prepdo == OVER || prepdo == 0) {
  236.         speak(170);
  237.         return (result);
  238.     } else if (prepdo == THROUG) {
  239.         oldloc = 0;
  240.         oldlc2 = 0;
  241.         if (loc == 26)
  242.         loc = 27;
  243.         else
  244.         loc = 26;
  245.     }
  246.     }
  247.     /* bottomless pit   */
  248.  
  249.     if (loc == 96) {
  250.     oldloc = 0;
  251.     oldlc2 = 0;
  252.     if (dobjs[0] == TUNNEL)
  253.         loc = 102;
  254.     else {
  255.         speak(266);
  256.         vdead();
  257.         loc = 97;
  258.     }
  259.     }
  260.     /* wheeeeeee!!!  */
  261.  
  262.     speak(49);
  263.     return (result);
  264. }
  265.  
  266.  
  267. vgo()
  268. {
  269.     int             aloc, xretr, dir, errno, nloc, k, kkk, indx1, ix;
  270.     int             m, n, xgox, kk, indx2, s;
  271.  
  272.  
  273.     /* the entrance to the cave at the waterfall */
  274.  
  275.     rmove = 0;
  276.     if (prepdo == BEHIND && loc == 24 && dobjs[0] == HORSET) {
  277.     horflg = 1;
  278.     oldlc2 = oldloc;
  279.     oldloc = loc;
  280.     loc = 25;
  281.     return;
  282.     }
  283.     aloc = loc;
  284.     if (actor == ROBOT)
  285.     aloc = obloc[ZROBOT];
  286.     /* translate go through barrier to direction  */
  287.  
  288.     if (dobjs[0] == BARRIE && prepdo == THROUG) {
  289.     prepdo = 0;
  290.     if (aloc == 26)
  291.         dobjs[0] = NORTHE;
  292.     else if (aloc == 19)
  293.         dobjs[0] = SOUTHW;
  294.     else if (aloc == 62 || aloc == 50)
  295.         dobjs[0] = NORTH;
  296.     else if (aloc == 86 || aloc == 63)
  297.         dobjs[0] = SOUTH;
  298.     else if (aloc == 68)
  299.         dobjs[0] = WEST;
  300.     else if (aloc == 90)
  301.         dobjs[0] = EAST;
  302.     else
  303.         prepdo = THROUG;
  304.     }
  305.     /*
  306.  
  307.      * all prepositional expressions must be handled by special code above
  308.  
  309.      * this point  
  310.  
  311.      
  312. */
  313.  
  314.     if (prepdo > DOWN) {
  315.     speak(94);
  316.     return;
  317.     }
  318.     xretr = 0;
  319.     dir = 0;
  320.     errno = 0;
  321.     if (prepdo == UP || prepdo == DOWN) {
  322.     if (dobjs[0] == 0)
  323.         dir = prepdo + 9 - PRPMIN;
  324.     else if (dobjs[0] > 0 && dobjs[0] <= NORTHW)
  325.         errno = 57;
  326.     else if (dobjs[0] == SPIRE && (aloc >= 12 && aloc <= 14))
  327.         dobjs[0] = 0;
  328.     else
  329.         errno = 28;
  330.     } else if (dobjs[0] > 0 && dobjs[0] <= NORTHW)
  331.     dir = dobjs[0] + 1 - NUNMIN;
  332.     else
  333.     errno = 28;
  334.     if (errno != 0)
  335.     goto lab9000;
  336.     /****** we have reached the point where we use the travel table  */
  337.     xgox = 0;
  338.     k = dir;
  339.     kkk = k;
  340.     if (adverb == QUICKL)
  341.     k = k + 64;
  342.     if (adverb == SLOWLY)
  343.     k = k + 32;
  344.     if (adverb == CAREFU)
  345.     k = k + 16;
  346.     /*
  347.      * if he says "go quickly" that will match "go quickly" or just "go" but
  348.      * "go" will not match "go quickly" . same for other adverbs 
  349.      */
  350.  
  351.     if (deadf)
  352.     k = kkk;
  353.     indx1 = dispat[aloc];
  354.     indx2 = dispat[aloc + 1];
  355.     for (ix = indx1; ix <= indx2 - 2; ix += 2)
  356.     if (trvtbl[ix] == k || kkk == trvtbl[ix])
  357.         goto lab200;
  358.     errno = 58;
  359.     goto lab9000;
  360. lab200:
  361.     indx1 = ix + 1;
  362.     m = trvtbl[indx1] / 512;
  363.     n = trvtbl[indx1] - m * 512;
  364.     if (actor != 1 && actor != ROBOT)
  365.     return;
  366.     else if (actor == ROBOT) {
  367.     if (m == 1) {
  368.         xgox = 1;
  369.         nloc = n;
  370.     } else if (m == 3 && n == 13 && aloc == 68) {
  371.         xgox = 1;
  372.         nloc = 90;
  373.     } else if (m == 3 && n == 6 && aloc == 74) {
  374.         xgox = 1;
  375.         nloc = 70;
  376.     } else;
  377.     }
  378.     /* unconditional motion */
  379.  
  380.     else if (m == 1) {
  381.     xgox = 1;
  382.     nloc = n;
  383.     xretr = 1;
  384.     /* unconditional stay where is */
  385.  
  386.     } else if (m == 2) {
  387.     errno = n;
  388.     /* forced to get out of chair */
  389.  
  390.     if (aloc == 184 || aloc == 187 || aloc == 166 ||
  391.         (aloc >= 175 && aloc <= 181))
  392.         spcloc = 0;
  393.     else;
  394.     } else if (m == 3) {
  395.     /***    special conditions */
  396.  
  397.     if (n == 1) {
  398.         /*
  399.          * to climb the spire you must wear shoes, but nothing else, and
  400.          * it must be daytime  
  401.              */
  402.  
  403.         if (daytim == 0 || (turns % 100) > 73) {
  404.         speak(123);
  405.         return;
  406.         }
  407.         if (obloc[CSHOES] == 3000) {
  408.         for (kk = 1; kk <= MOVMAX; kk++) {
  409.             if (kk == CSHOES)
  410.             continue;
  411.             if (obloc[kk] == 1000 || (obloc[kk] == 3000 && kk != CKEY))
  412.             errno = 60;
  413.         }
  414.         if (errno != 60) {
  415.             xgox = 1;
  416.             nloc = 13;
  417.         }
  418.         }
  419.     }
  420.     /* to get behind the horsetails */
  421.  
  422.     else if (n == 2) {
  423.         if (horflg || (locdat[25] & 16384) != 0) {
  424.         xgox = 1;
  425.         nloc = 25;
  426.         }
  427.     }
  428.     /* into the bar  */
  429.  
  430.     else if (n == 3) {
  431.         if (daytim == 1 || deadf) {
  432.         xgox = 1;
  433.         xretr = 1;
  434.         nloc = 42;
  435.         } else if (marflg[0]) {
  436.         speak(128);
  437.         return;
  438.         }
  439.     }
  440.     /* underground from mars */
  441.  
  442.     else if (n == 4 || n == 11) {
  443.         if ((obimpr[MDOOR] & 2) == 0) {
  444.         xgox = 1;
  445.         xretr = 1;
  446.         nloc = 135;
  447.         if (n == 11)
  448.             nloc = 41;
  449.         }
  450.     } else if (n == 5) {
  451.         /* warehouse  */
  452.  
  453.         if ((obimpr[RDOOR] & 2) != 2) {
  454.         xgox = 1;
  455.         xretr = 0;
  456.         nloc = 47;
  457.         if (aloc == 47)
  458.             nloc = 51;
  459.         }
  460.     } else if (n == 6) {
  461.         if ((obimpr[ZVINE] & 56) == 16) {
  462.         xgox = 1;
  463.         nloc = 70;
  464.         xretr = 1;
  465.         }
  466.     } else if (n == 7) {
  467.         /* rabbit hole  */
  468.  
  469.         if (obimpr[RHOLE] == 17) {
  470.         xgox = 1;
  471.         nloc = 96;
  472.         }
  473.     } else if (n == 8) {
  474.         /* going down the pole c */
  475.  
  476.         if ((obimpr[ZLATEX] & 56) == 24) {
  477.         xgox = 1;
  478.         nloc = 80;
  479.         }
  480.     } else if (n == 9 || n == 12) {
  481.         /* glass door  */
  482.  
  483.         if ((obimpr[GDOOR] & 2) == 0) {
  484.         xgox = 1;
  485.         xretr = 1;
  486.         nloc = 136;
  487.         if (aloc == 136)
  488.             nloc = 85;
  489.         }
  490.     }
  491.     /* beehive  */
  492.  
  493.     else if (n == 10) {
  494.         if (obimpr[ZDEET] >= 4096) {
  495.         xgox = 1;
  496.         nloc = 88;
  497.         if (aloc == 88)
  498.             nloc = 87;
  499.         }
  500.     } else if (n == 13);
  501.     else if (n == 14) {
  502.         if (obimpr[ZLOUVE] == 9) {
  503.         xgox = 1;
  504.         xretr = 1;
  505.         nloc = 142;
  506.         if (aloc == 142)
  507.             nloc = 98;
  508.         }
  509.     }
  510.     /* the scree slope  */
  511.  
  512.     else if (n == 15) {
  513.         if (screef > 0) {
  514.         xgox = 1;
  515.         xretr = 1;
  516.         nloc = 151;
  517.         }
  518.     } else if (n == 16) {
  519.         if ((obimpr[ODOOR] & 2) == 0) {
  520.         xgox = 1;
  521.         xretr = 1;
  522.         nloc = 166;
  523.         if (aloc == 166)
  524.             nloc = 165;
  525.         }
  526.     } else if (n == 17) {
  527.         if ((obimpr[BDOOR] & 2) == 0) {
  528.         xgox = 1;
  529.         xretr = 1;
  530.         if (aloc == 174)
  531.             nloc = 175;
  532.         else if (aloc == 175)
  533.             nloc = 174;
  534.         else if (aloc == 181)
  535.             nloc = 182;
  536.         else if (aloc == 184)
  537.             nloc = 185;
  538.         else if (aloc == 187)
  539.             nloc = 188;
  540.         else;
  541.         }
  542.     } else if (n == 18) {
  543.         if (obimpr[HMURAL] == 209) {
  544.         xgox = 1;
  545.         xretr = 1;
  546.         nloc = 170;
  547.         }
  548.     } else {
  549.         linout("bug in travel table", 19);
  550.         return;
  551.     }
  552.     }
  553.     /***    end special conditions
  554.  
  555.             he dies. code give his final location */
  556.  
  557.     else if (m == 4) {
  558.     if (deadf)
  559.         errno = 46;
  560.     else {
  561.         oldlc2 = 0;
  562.         oldloc = 0;
  563.         if (loc == 13 || loc == 14)
  564.         loc = 12;
  565.         if (loc == 19 || loc == 21)
  566.         loc = 22;
  567.         if (loc == 76)
  568.         loc = 79;
  569.         /* if he moved when he dies, special code goes here  */
  570.  
  571.         locdat[loc] |= 16384;
  572.         vdead();
  573.         if (loc == 96) {
  574.         loc = 97;
  575.         locdat[97] |= 16384;
  576.         }
  577.         errno = n;
  578.     }
  579.     }
  580.     /* goes to newloc if he is dead and has been there before */
  581.  
  582.     else if (m == 5) {
  583.     if (deadf && (locdat[n] & 16384) != 0) {
  584.         xgox = 1;
  585.         nloc = n;
  586.     }
  587.     }
  588.     /* motion with some probability */
  589.  
  590.     else if (m >= 16 && m <= 31) {
  591.     s = (m - 15) * 6;
  592.     if (pct(s)) {
  593.         xgox = 1;
  594.         nloc = n;
  595.     }
  596.     } else {
  597.     speak(252);
  598.     return;
  599.     }
  600.  
  601.  
  602.     if (errno != 0)
  603.     goto lab9000;
  604.     if (xgox && actor == 1) {
  605.     if ((locdat[nloc] & 25) == 0 && obloc[25] != 1000 && !deadf)
  606.         errno = 258;
  607.     else if ((locdat[nloc] & 32) != 0) {
  608.         oldlc2 = oldloc;
  609.         oldloc = loc;
  610.         loc = nloc;
  611.         if (!xretr || loc == 38 || loc == 97 || loc == 127
  612.         || loc == 88 || loc == 74 || loc == 96) {
  613.         oldloc = 0;
  614.         oldlc2 = 0;
  615.         }
  616.     } else
  617.         errno = 59;
  618.     } else if (xgox && actor == ROBOT) {
  619.     if ((locdat[nloc] & 64) != 0) {
  620.         obloc[ZROBOT] = nloc;
  621.         rmove = 1;
  622.     } else
  623.         errno = 299;
  624.     } else {
  625.     ix = indx1 + 1;
  626.     if (trvtbl[ix] == kkk || trvtbl[ix] == k)
  627.         goto lab200;
  628.     errno = 58;
  629.     if (actor == 1)
  630.         errno = 299;
  631.     }
  632.     /***   all errors and "you are dead" or "impossibility" messages go here */
  633.  
  634. lab9000:
  635.     if (errno != 0)
  636.     speak(errno);
  637. }
  638.  
  639.  
  640.  
  641. vretre()
  642. /* retreat or back */
  643.  
  644. {
  645.     if (oldloc == 0)
  646.     speak(65);
  647.     else {
  648.     loc = oldloc;
  649.     oldloc = oldlc2;
  650.     oldlc2 = 0;
  651.     }
  652. }
  653.  
  654. vclimb()
  655. {
  656.     int             result;
  657.  
  658.     result = 0;
  659.     /*
  660.  
  661.      * if result is 1 call vgo rubber tree jungle trees 
  662.  
  663.      
  664. */
  665.  
  666.     if ((loc == 64 || loc == 67) && (dobjs[0] == TREE || dobjs[0]
  667.                      == 0))
  668.     speak(430);
  669.     else if ((loc == 78 || loc == 79) && (dobjs[0] == TREE || dobjs[0]
  670.                       == 0))
  671.     speak(431);
  672.     else if (loc == 65 && (prepdo == 0 || prepdo == UP) && (dobjs[0]
  673.                         == TREE || dobjs[0] == 0)) {
  674.     oldlc2 = oldloc;
  675.     oldloc = loc;
  676.     loc = 66;
  677.     } else if (loc == 66 && (prepdo == DOWN || prepdo == 0) && (dobjs[0]
  678.                         == 0 || dobjs[0] == TREE)) {
  679.     oldlc2 = oldloc;
  680.     oldloc = loc;
  681.     loc = 65;
  682.     }
  683.     /* pole  */
  684.  
  685.     else if ((loc == 80 || loc == 79 || loc == 76) && (dobjs[0] == POLE
  686.                                || dobjs[0] == 0)) {
  687.     result = 1;
  688.     wrdnum[0] = GO;
  689.     dobjs[0] = 0;
  690.     if (prepdo == 0)
  691.         prepdo = UP;
  692.     }
  693.     /*
  694.  
  695.      * you can climb the spire if you are careful but the actual motion is
  696.  
  697.      * done by "vgo" 
  698.  
  699.      
  700. */
  701.  
  702.     else if ((loc >= 12 && loc <= 14) && (dobjs[0] == 0 || dobjs[0]
  703.                       == SPIRE)) {
  704.     wrdnum[0] = GO;
  705.     dobjs[0] = 0;
  706.     result = 1;
  707.     if ((loc == 12 && (prepdo == 0 || prepdo == UP)) ||
  708.         (loc == 13 && (prepdo == 0 || prepdo == UP)))
  709.         prepdo = UP;
  710.     else if (((loc == 13 || loc == 14) && prepdo == DOWN) ||
  711.          (loc == 14 && prepdo == 0))
  712.         prepdo = DOWN;
  713.     else;
  714.     }
  715.     /* you can climb over the log but not up a tree!  */
  716.  
  717.     else if (loc == 19 || loc == 21) {
  718.     if ((dobjs[0] == TREE || dobjs[0] == LOG) && prepdo == OVER) {
  719.         prepdo = 0;
  720.         result = 1;
  721.         dobjs[0] = NORTHE;
  722.         {
  723.         if (loc == 21)
  724.             dobjs[0] = SOUTHW;
  725.         }
  726.     } else if (dobjs[0] == TREE && (prepdo == UP || prepdo == 0))
  727.         speak(108);
  728.     else
  729.         speak(94);
  730.     }
  731.     /* you can't climb the tower  */
  732.  
  733.     else if (loc == 48 && (prepdo == 0 || prepdo == UP) &&
  734.          (dobjs[0] == 0 || dobjs[0] == TOWER))
  735.     speak(138);
  736.     /* but you can climb down the tower */
  737.  
  738.     else if (loc == 49 && (prepdo == 0 || prepdo == DOWN) &&
  739.          (dobjs[0] == TOWER || dobjs[0] == 0)) {
  740.     oldlc2 = oldloc;
  741.     oldloc = loc;
  742.     loc = 48;
  743.     }
  744.     /* you can't climb the barrier  */
  745.  
  746.     else if ((loc == 26 || loc == 27) && dobjs[0] == BARRIE)
  747.     speak(170);
  748.     else if (dobjs[0] == TREE) {
  749.     if ((locdat[loc] & 2048) == 2048)
  750.         speak(244);
  751.     else
  752.         speak(245);
  753.     } else if (loc == 20 || (loc >= 52 && loc <= 56)) {
  754.     wrdnum[0] = GO;
  755.     {
  756.         if (prepdo == 0)
  757.         prepdo = UP;
  758.     }
  759.     result = 1;
  760.     } else
  761.     speak(50);
  762.     return (result);
  763. }
  764.  
  765.  
  766. vrun()
  767. {
  768.     int             result;
  769.     result = 0;
  770.     /* ru translates to "go quickly"  */
  771.  
  772.     if (adverb == SLOWLY)
  773.     speak(51);
  774.     else {
  775.     result = 1;
  776.     adverb = QUICKL;
  777.     wrdnum[0] = GO;
  778.     }
  779.     return (result);
  780. }
  781.  
  782.  
  783. vswim()
  784. {
  785.     int             spk, m, i, xloc;
  786.     spk = 0;
  787.     /* he can't swim at night (for no real reason)  */
  788.  
  789.     if (daytim == 0 && (loc == 5 || loc == 6 || loc == 15 || loc
  790.             == 17))
  791.     spk = 122;
  792.     /* he can't swim while dead */
  793.  
  794.     else if (deadf)
  795.     spk = 46;
  796.     /* you must swim in the lake or poool  */
  797.  
  798.     else if ((loc < 5 || loc > 17 || (loc > 6 && loc < 15))
  799.          && loc != 122)
  800.     spk = 52;
  801.     else;
  802.     if (spk != 0) {
  803.     speak(spk);
  804.     return (0);
  805.     }
  806.     m = dobjs[0];
  807.     if ((m == WATER && prepdo != IN) || ((m == ISLAND || m == SHORE)
  808.                 && prepdo != TO) || (m == POOL && prepdo != IN))
  809.     spk = 28;
  810.     else if ((loc == 5 && (m == WEST || m == ISLAND)) ||
  811.          (loc == 15 && m == EAST) ||
  812.          (loc == 16 && m == SOUTH))
  813.     xloc = 6;
  814.     else if (loc == 6 && (m == EAST || m == SHORE))
  815.     xloc = 5;
  816.     else if ((loc == 6 && m == NORTH) ||
  817.          (loc == 17 && (m == SOUTH || m == ISLAND)) ||
  818.          (loc == 16 && m == WEST))
  819.     xloc = 15;
  820.     else if ((loc == 6 && m == SOUTH) || (loc == 15 && m == WEST))
  821.     xloc = 16;
  822.     else if (loc == 15 && (m == NORTH || m == SHORE))
  823.     xloc = 17;
  824.     else if ((loc == 5 || loc == 6 || (loc <= 17 && loc >= 15))
  825.          && (m == WATER)) {
  826.     if (dirty < 10)
  827.         spk = 110;
  828.     else
  829.         spk = 111;
  830.     } else if (loc == 122 && m == POOL)
  831.     xloc = 123;
  832.     else
  833.     spk = 54;
  834.     if (spk == 0) {
  835.     /* but not if you are wearing too much  */
  836.  
  837.     for (i = 1; i <= MOVMAX; i++) {
  838.         if (i == CSHOES || i == CKEY || i == CFISH || i == DFISH
  839.         || i == BNET || i == GSPHER)
  840.         continue;
  841.             if(obloc[i] == 1000 || obloc[i] == 3000) {
  842.             speak(53);
  843.             return (0);
  844.             }
  845.     }
  846.     oldlc2 = 0;
  847.     oldloc = 0;
  848.     loc = xloc;
  849.     return (0);
  850.     }
  851.     speak(spk);
  852.     return (0);
  853. }
  854.